double *latitude, double *longitude, const char *module);
int parse_distance(const char *str, double *val, double scale, const char *module);
int parse_speed(const char *str, double *val, const double scale, const char *module);
+time_t parse_date(const char *str, const char *format, const char *module);
/*
* From util_crc.c
*/
-#include "defs.h"
-#include "jeeps/gpsmath.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <time.h>
+#include "defs.h"
+#include "jeeps/gpsmath.h"
+#include "strptime.h"
+
/*
* parse_distance:
*
return result;
}
+
+
+time_t
+parse_date(const char *str, const char *format, const char *module)
+{
+ struct tm tm;
+
+ memset(&tm, 0, sizeof(tm));
+
+ if (format) {
+ char *cx = strptime(str, format, &tm);
+ if ((cx != NULL) && (*cx != '\0'))
+ fatal("%s: Could not parse date string (%s).\n", module, str);
+ }
+ else {
+ int p1, p2, p3, ct;
+ char sep[2];
+
+ ct = sscanf(str, "%d%1[-.//]%d%1[-.//]%d", &p1, sep, &p2, sep, &p3);
+ if (ct != 5)
+ fatal("%s: Could not parse date string (%s).\n", module, str);
+
+ if ((p1 > 99) || (sep[0] == '-')) { /* Y-M-D (iso like) */
+ tm.tm_year = p1;
+ tm.tm_mon = p2;
+ tm.tm_mday = p3;
+ }
+ else if (sep[0] == '.') { /* Germany and any other countries */
+ tm.tm_mday = p1; /* have a fixed D.M.Y format */
+ tm.tm_mon = p2;
+ tm.tm_year = p3;
+ }
+ else {
+ tm.tm_mday = p2;
+ tm.tm_mon = p1;
+ tm.tm_year = p3;
+ }
+ if ((p1 < 100) && (p2 < 100) && (p3 < 100)) {
+ if (tm.tm_year < 70) tm.tm_year += 2000;
+ else tm.tm_year += 1900;
+ }
+ /* some low-level checks */
+ if ((tm.tm_mon > 12) || (tm.tm_mon < 1) || (tm.tm_mday > 31) || (tm.tm_mday < 1))
+ fatal("%s: Could not parse date string (%s).\n", module, str);
+
+ tm.tm_year -= 1900;
+ tm.tm_mon -= 1;
+ }
+
+ return mkgmtime(&tm);
+}